
        <html>
			<head>
			     <title>Browser Security-同源策略、伪URL的域 - 瞌睡龙</title>
				 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
			</head>
			<body>
				<h1>原文地址:<a href="http://drops.wooyun.org/tips/151">http://drops.wooyun.org/tips/151</a></h1>
				
      <p>
        <h3>同源策略</h3>

<hr />

<h4>同源策略的文档模型</h4>

<p>同源策略（Same Origin policy，SOP），也称为单源策略（Single Origin policy），它是一种用于Web浏览器编程语言（如JavaScript和Ajax）的安全措施，以保护信息的保密性和完整性。</p>

<p>同源策略能阻止网站脚本访问其他站点使用的脚本，同时也阻止它与其他站点脚本交互。
<!--more--></p>

<table>
<thead>
<tr>
  <th align="left">原始资源</th>
  <th align="left">要访问的资源</th>
  <th align="center">非IE浏览器</th>
  <th align="center">IE浏览器</th>
</tr>
</thead>
<tbody>
<tr>
  <td align="left">http://example.com/a/</td>
  <td align="left">http://example.com/b/</td>
  <td align="center">可以访问</td>
  <td align="center">可以访问</td>
</tr>
<tr>
  <td align="left">http://example.com/</td>
  <td align="left">http://www.example.com/</td>
  <td align="center">主机不匹配</td>
  <td align="center">主机不匹配</td>
</tr>
<tr>
  <td align="left">http://example.com/a/</td>
  <td align="left">https://example.com/a/</td>
  <td align="center">协议不匹配</td>
  <td align="center">协议不匹配</td>
</tr>
<tr>
  <td align="left">http://example.com:81/</td>
  <td align="left">http://example.com/</td>
  <td align="center">端口不匹配</td>
  <td align="center">可以访问</td>
</tr>
</tbody>
</table>

<p>同源策略一开始是为了管理DOM之间的访问，后来逐渐扩展到Javascript对象，但并非是全部。</p>

<p>例如非同源的脚本之间可以调用location.assign()和location.replace()。</p>

<p>同源策略在提高了安全性，但同时也降低了灵活性。</p>

<p>例如很难将login.example.com与payments.example.com两个域之间的数据可以方便的传送。</p>

<p>介绍两种解决方式：document.domain和postMessage()。</p>

<p>javascript允许子域之间使用顶级域名。</p>

<p>例如login.example.com和payments.example.com都可以进行如下设置：</p>

<pre><code>document.domain="example.com"
</code></pre>

<p>设置这个属性之后，子域之间可以方便的通信，需注意的是协议和端口号必须相同。</p>

<table cellspacing="0" class="drops_data_table">
  <tr>
    <td valign="top">
      <font color="#4241FF">原始资源</font>
    </td>
    
    <td valign="top">
      <font color="#4241FF"></font>
    </td>
    
    <td valign="top">
      <font color="#4241FF">访问的资源</font>
    </td>
    
    <td valign="top">
      <font color="#4241FF"></font>
    </td>
    
    <td valign="top">
      <font color="#4241FF">结果</font>
    </td>
  </tr>
  
  <tr>
    <td valign="top">
      <b>URL</b>
    </td>
    
    <td valign="top">
      <b>document.domain</b>
    </td>
    
    <td valign="top">
      <b>URL</b>
    </td>
    
    <td valign="top">
      <b>document.domain</b>
    </td>
    
    <td valign="top">
    </td>
  </tr>
  
  <tr>
    <td valign="top">http://www.example.com/
    </td>
    
    <td valign="top">example.com
    </td>
    
    <td valign="top">http://payments.example.com/
    </td>
    
    <td valign="top">
      example.com
    </td>
    
    <td valign="top">
    可以访问
    </td>
  </tr>
  
  <tr>
    <td valign="top">
      http://www.example.com/
    </td>
    
    <td valign="top">
      example.com
    </td>
    
    <td valign="top">
      https://payments.example.com/
    </td>
    
    <td valign="top">
      example.com
    </td>
    
    <td valign="top">
      协议不匹配
    </td>
  </tr>
  
  <tr>
    <td valign="top">
      http://payments.example.com
    </td>
    
    <td valign="top">
      example.com
    </td>
    
    <td valign="top">
      http://example.com/
    </td>
    
    <td valign="top">
      <b>(不设置)</b>
    </td>
    
    <td valign="top">
      拒绝访问
    </td>
  </tr>
  
  <tr>
    <td valign="top">
      http://www.example.com/
    </td>
    
    <td valign="top">
      <b>(不设置)</b>
    </td>
    
    <td valign="top">
      http://www.example.com
    </td>
    
    <td valign="top">
      example.com
    </td>
    
    <td valign="top">
      拒绝访问
    </td>
  </tr>
</table>

<p>postMessage()是HTML5的一个API接口，由于比较新，所以在IE6和IE7中不支持。 1 向另外一个iframe发送消息：</p>

<pre><code>var message = 'Hello' + (new Date().getTime());
    window.parent.frames[1].postMessage(message, '*');
</code></pre>

<p>iframe1.html需要向iframe2.html发送消息，也就是第二个iframe，所以是window.parent.frames[1]。</p>

<p>如果是向父页面发送消息就是window.parent。</p>

<p>postMessage这个函数接收二个参数，缺一不可，第一个参数即你要发送的数据。</p>

<p>第二个参数是非常重要，主要是出于安全的考虑，一般填写允许通信的域名。</p>

<p>这里为了简化，所以使用’*'，即不对访问的域进行判断。</p>

<p>2 另外一个iframe监听消息事件：</p>

<pre><code>iframe2.html中写个监听message事件，当有消息传到iframe2.html时就会触发这个事件。
var onmessage = function(e) {
    var data = e.data,p = document.createElement('p');
    p.innerHTML = data;
    document.getElementById('display').appendChild(p);
};
 //监听postMessage消息事件
if (typeof window.addEventListener != 'undefined') {
    window.addEventListener('message', onmessage, false);
 } else if (typeof window.attachEvent != 'undefined') {
    window.attachEvent('onmessage', onmessage);
}
</code></pre>

<p>如果你有加域名限,比如下面的代码：</p>

<pre><code>window.parent.frames[1].postMessage(message, 'http://www.test.com');
</code></pre>

<p>就要在onmessage中追加个判断：</p>

<pre><code>if(event.origin !== 'http://www.test.com') return;
</code></pre>

<h4>XMLHttpRequest的同源策略</h4>

<p>一个简单的同步XMLHttpRequest请求：</p>

<pre><code>var x = new XMLHttpRequest();
x.open("POST", "/some_script.cgi", false);
x.setRequestHeader("X-Random-Header", "Hi mom!");
x.send("...POST payload here...");
alert(x.responseText);
</code></pre>

<p>XMLHttpRequest请求严格遵守同源策略，非同源不可以请求。</p>

<p>这个API也做过很多测试与改进，下面列出之前的测试方法：</p>

<pre><code>var x = new XMLHttpRequest();
x.open("POST", "http://www.example.com/", false);
// 定义发送内容长度为7
x.setRequestHeader("Content-Length", "7");
// 构造的http请求。
x.send(
"Gotcha!\n" +
"GET /evil_response.html HTTP/1.1\n" +
"Host: www.bunnyoutlet.com\n\n"
);
</code></pre>

<p>现在的浏览器都不存在上面的隐患，包括基本都禁用了TRACE方法，防止httponly的cookie泄漏问题等。</p>

<h4>Web Storage的同源策略</h4>

<p>Web Storage是由Mozilla的工程师在Firefox1.5中加入的，并且加入了HTML5中，现在的浏览器都支持，除了IE6与IE7。</p>

<p>JavaScript可以通过localStorage与sessionStorage对Web Storage进行创建，检索和删除：</p>

<pre><code>localStorage.setItem("message", "Hi mom!"); 
alert(localStorage.getItem("message")); 
localstorage.removeItem("message");
</code></pre>

<p>localStorage对象可以长时间保存，并且遵守同源策略。</p>

<p>但是在IE8中localStorage会把域名相同但是协议分别为HTTP和HTTPS的内容放在一起，IE9中已修改。</p>

<p>在Firefox中，localStorage没有问题，但是sessionStorage也是会把域名相同的HTTP与HTTPS放在一起。</p>

<h4>Cookie的安全策略</h4>

<p>设置Cookie总结</p>

<table cellspacing="0" cellpadding="0" style="border-collapse: collapse">
  <tr>
    <td rowspan="2" valign="middle" style="width: 188.6px; height: 45.5px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        <b>在foo.example.com设置cookie，domain设置为：</b><br />
      </p>
    </td>
    
    <td colspan="2" valign="middle" style="width: 387.3px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        <b>最终cookie的范围</b><br />
      </p>
    </td>
  </tr>
  
  <tr>
    <td valign="middle" style="width: 188.9px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        <b>非IE浏览器</b><br />
      </p>
    </td>
    
    <td valign="middle" style="width: 188.4px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        <b>IE浏览器</b><br />
      </p>
    </td>
  </tr>
  
  <tr>
    <td valign="middle" style="width: 188.6px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        设置为空<br />
      </p>
    </td>
    
    <td valign="middle" style="width: 188.9px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        foo.example.com（一个域）<br />
      </p>
    </td>
    
    <td valign="middle" style="width: 188.4px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        ＊.foo.example.com<br />
      </p>
    </td>
  </tr>
  
  <tr>
    <td valign="middle" style="width: 188.6px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        bar.foo.example.com<br />
      </p>
    </td>
    
    <td colspan="2" valign="middle" style="width: 387.3px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        cookie设置失败，设置的域是当前域的一个子域<br />
      </p>
    </td>
  </tr>
  
  <tr>
    <td valign="middle" style="width: 188.6px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        foo.example.com<br />
      </p>
    </td>
    
    <td colspan="2" valign="middle" style="width: 387.3px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        *.foo.example.com<br />
      </p>
    </td>
  </tr>
  
  <tr>
    <td valign="middle" style="width: 188.6px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        baz.example.com<br />
      </p>
    </td>
    
    <td colspan="2" valign="middle" style="width: 387.3px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        cookie设置失败，域名不匹配<br />
      </p>
    </td>
  </tr>
  
  <tr>
    <td valign="middle" style="width: 188.6px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        example.com<br />
      </p>
    </td>
    
    <td colspan="2" valign="middle" style="width: 387.3px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        *.example.com<br />
      </p>
    </td>
  </tr>
  
  <tr>
    <td valign="middle" style="width: 188.6px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        ample.com<br />
      </p>
    </td>
    
    <td colspan="2" valign="middle" style="width: 387.3px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        cookie设置失败，域名不匹配<br />
      </p>
    </td>
  </tr>
  
  <tr>
    <td valign="middle" style="width: 188.6px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        .com<br />
      </p>
    </td>
    
    <td colspan="2" valign="middle" style="width: 387.3px; height: 17.8px; border-style: solid; border-width: 2.0px 2.0px 2.0px 2.0px; border-color: #000000 #000000 #000000 #000000; padding: 4.0px 4.0px 4.0px 4.0px">
      <p style="margin: 0px; font-size: 12px; font-family: Helvetica; min-height: 14px;">
        设置失败，域名太广，存在安全风险。
      </p>
    </td>
  </tr>
</table>

<p>Cookie中的path参数可以设定指定目录的cookie。</p>

<p>例如设定domain为example.com，path为/some/path/ 在访问下面url的时候会带上设定的cookie：</p>

<p>http://foo.example.com/some/path/subdirectory/hello_world.txt</p>

<p>存在一定的安全风险，因为path的设定没有考虑到同源策略。</p>

<p>httponly属性可以防止通过document.cookie的API访问设定的cookie。</p>

<p>secure属性设定后只有在通过https传输时才会带上设定的cookie，可以防止中间人攻击。</p>

<h4>Adobe Flash</h4>

<p>AllowScriptAccess参数：用来控制flash通过ExternallInterface.call()函数调用javascript的时的限制。</p>

<p>有三个值：always，never和sameorigin，最后一个值只允许同域的JavaScript操作（08年之前默认为always，现在默认为sameorigin）。</p>

<p>AllowNetworking参数：用来控制flash与外部的网络通讯。</p>

<p>可选的值为：all（允许使用所有的网络通讯，默认值），internal（flash不能与浏览器通讯如navigateToURL，但是可以调用其他的API），none（禁止任何的网络通讯）</p>

<h4>本地文件</h4>

<p>由于本地文件都是通过file:协议进行访问的，由于不存在host，所以无法遵循同源策略。</p>

<p>所以本地保存的一个HTML文件，在浏览器中通过file:协议访问后，可以通过XMLHttpRequest或DOM对本地其他文件进行操作。</p>

<p>与此同时，也可以对互联网的其他资源做同样的操作。各浏览器厂商意识到这个问题，并努力做了修改：</p>

<p>测试代码：</p>

<p>1.html（1.txt随机写一些字符串即可）</p>

<pre><code>&lt;script&gt;
function createXHR(){
  return window.XMLHttpRequest?
  new XMLHttpRequest():
  new ActiveXObject("Microsoft.XMLHTTP");
}
function getlocal(url){
  xmlHttp = createXHR();
  xmlHttp.open("GET",url,false);
  xmlHttp.send();
  result = xmlHttp.responseText;
  return result;
}
function main(){
  url = "file://路径/1.txt";
  alert(url);
  result = getlocal(url);
  alert(result);
}
main();
&lt;/script&gt;
</code></pre>

<p>结论：</p>

<pre><code>1 Chrome浏览器（使用WebKit内核的浏览器）
完全禁止跨文档的XMLHttpRequest和DOM操作，并禁止了document.cookie和&lt;meta http-equiv="Set-Cookie" ...&gt;的操作。
2 Firefox
允许访问同目录与子目录里的文件。也可通过document.cookie与&lt;meta http- equiv="Set-Cookie" ...&gt;设定cookie，file:协议下cookie共享，storage也是。
3 IE7及以上
允许本地文件之间的访问，但是在执行JavaScript之前会有一个提示，用户点击通过之后可以执行，cookie域Firefox类似，但是file:协议下不支持storage。
4 IE6
允许本地文件的访问，同时也允许对http协议的访问，cookie也是一样。
</code></pre>

<h3>伪URL的域</h3>

<hr />

<p>一些web应用用到了伪URL例如about:，javascript:，和data:来创建HTML文档。</p>

<p>这种方法是为了不需要再与服务器通信，可以节约时间更快的响应，但是也带进了很多安全隐患。</p>

<pre><code>about:blank
</code></pre>

<p>about协议在现在的浏览器中有很多用途，但是其中大部分不是为了获取正常的页面。</p>

<p>about:blank这个URL可以用来被创建DOM对象，例如：</p>

<pre><code>&lt;iframe src="about:blank" name="test"&gt;&lt;/iframe&gt;
&lt;script&gt; 
frames["test"].document.body.innerHTML = "&lt;h1&gt;Hi!&lt;/h1&gt;";
&lt;/script&gt;
</code></pre>

<p>在浏览器中，创建一个about:blank页面，它继承的域为创建它的页面的域。</p>

<p>例如，点击一个链接，提交一个表单，创建一个新窗口，但是当用户手动输入about:或者书签中打开的话，他的域是一个特殊的域，任何其他的页面都不可以访问。</p>

<pre><code>data:协议
</code></pre>

<p>data:协议是设计用来放置小数据的，例如图标之类的，可以减少http请求数量，例如：</p>

<pre><code>&lt;img src="..."&gt;
</code></pre>

<p>用以下代码研究域的问题：</p>

<pre><code>&lt;iframe src="data:text/html;charset=utf-8,&lt;script&gt;alert(document.domain)&lt;/script&gt;" &gt;  
</code></pre>

<p>在Chrome与Safari中，所有的data:都会赋予一个单独的，不可获取的域，而不是从父域中继承的。</p>

<p>Firefox与Opera中，域是继承于当前页面。</p>

<p>IE8之前的版本不支持data:协议。</p>

<p>javascript:和vbscript:</p>

<p>javascript:协议允许后面执行javascript代码，并且继承了调用的当前域。</p>

<p>有些情况会对后面的内容处理两次，如果代码正确的话，会把后面的代码当成html解析，覆盖掉原来的html代码：</p>

<pre><code>&lt;iframe src='javascript:"&lt;b&gt;2 + 2 = " + (2+2) + "&lt;/b&gt;"'&gt; 
&lt;/iframe&gt;
</code></pre>      </p>
    
			</body>
		</html>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          